package com.jacklei.ch01;
/*
        将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。

        比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：

        P   A   H   N
        A P L S I I G
        Y   I   R
        之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。

        请你实现这个将字符串进行指定行数变换的函数：

        string convert(string s, int numRows);
        提示：

            1 <= s.length <= 1000
            s 由英文字母（小写和大写）、',' 和 '.' 组成
            1 <= numRows <= 1000

        来源：力扣（LeetCode）
        链接：https://leetcode.cn/problems/zigzag-conversion
        著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
        */


public class Z字形转换 {
    public String convert1(String s, int numRows) {
        int n = s.length();
        int r = numRows;
        if(numRows ==1 || n < r) return s;
        char[] chars = s.toCharArray();
        int t = r + ( r - 2);
        int c = (n + t - 1)/t *(r -1);
        char[][] mat = new char[r][c];
        for(int p = 0, x = 0, y = 0; p < n; p++) {
            mat[x][y] = s.charAt(p);
            if(p % t < r-1){
                x++;
            }else {
                x--;
                y++;
            }
        }
        StringBuffer stringBuffer = new StringBuffer();
        for (char[] chars1 : mat) {
            for (char c1 : chars1) {
                if(c1 != '\0')
                stringBuffer.append(c1);
            }

        }
        return stringBuffer.toString();
    }

    public static void main(String[] args) {
        Z字形转换 z字形转换 = new Z字形转换();
        String pahnaplsiigyir = z字形转换.convert1("PAHNAPLSIIGYIR", 2);
        System.out.println(pahnaplsiigyir);
    }
}
